/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../data_struct/head.h"
#include "../helper_objs/head.h"
#include "../config/head.h"
#include "../impl/head.h"
#include "../macro/head.h"
#include "../msg/head.h"
#include "path.h"

namespace xos_http
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static path::ITEM_DATA xos_item_data;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    path::path()
    {
        init_data();
    }

    path::~path()
    {
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int path::get_xos_item_data( ITEM_DATA *& item_ptr )
    {
        int ret = 0;
        xos_item_data.set_container( mgr::container() );
        item_ptr = &xos_item_data;
        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    path * path::add_dir_path( const char * lpszPath )
    {
        xos_box::i_string * pStr = mgr::container()->box()->string();
        xos::i_dir * pDir = mgr::container()->xos()->dir();
        xos::i_misc * pMisc = mgr::container()->misc();
        path * pRet = 0;
        int ret = 0;
        if( 0 == ret )
        {
            pRet = get_path( lpszPath );
            if( pRet )
            {
                ret = 1;
            }
        }
        // 添加本地目录
        if( 0 == ret )
        {
            pStr->set( m_full_path.c_str() );
            pMisc->path_append( pStr, lpszPath );
            pDir->create_directory( pStr->get( 0, 0 ) );
        }
        // 添加path结点
        if( 0 == ret )
        {
            path::T * pT = 0;
            xos_stl::init_pool_item( pT );
            pT->m_pFatherPath = this;
            pT->m_full_path = pStr->get( 0, 0 );
            pStr->set( m_full_uri.c_str() );
            pStr->url_append( lpszPath );
            pT->m_full_uri = pStr->get( 0, 0 );
            pT->m_path = lpszPath;
            add_path( pT );
            pRet = pT;
        }
        xos_stl::release_interface( pDir );
        xos_stl::release_interface( pStr );
        return pRet;
    }

    path * path::get_path( const char * lpszName )
    {
        path * pRet = 0;
        xos_stl::auto_lock<thread_lock> lock( &m_dir_lock );
        pRet = (path*)m_pDirProp->obj( lpszName );
        return pRet;
    }

    int path::add_path( path * pPath )
    {
        int ret = 1;
        xos_stl::auto_lock<thread_lock> lock( &m_dir_lock );
        const char * lpszName = pPath->m_path.c_str();
        xos::i_release * pR = m_pDirProp->obj( lpszName );
        if( !pR )
        {
            m_pDirProp->set_obj( lpszName, pPath, true );
            pPath->m_pFatherPath = this;
            ret = 0;
        }
        return ret;
    }

    int path::add_file( const char * lpszId, file * pFile )
    {
        int ret = 1;
        xos_stl::auto_lock<thread_lock> lock( &m_file_lock );
        xos::i_release * pR = m_pFileProp->obj( lpszId );
        if( !pR )
        {
            m_pFileProp->set_obj( lpszId, pFile, true );
            m_file_list.push_back( (file::T*)pFile );
            pFile->m_pFatherPath = this;
            ret = 0;
        }
        return ret;
    }

    file * path::get_file( const char * lpszId )
    {
        file * pRet = 0;
        xos_stl::auto_lock<thread_lock> lock( &m_file_lock );
        pRet = (file *)m_pFileProp->obj( lpszId );
        return pRet;
    }

    int path::sort_file()
    {
        int ret = 0;
        m_file_list.sort( xos_stl::p_less<file::T> );
        return ret;
    }

    int path::get_filters( module::LIST & m_list )
    {
        int ret = 0;
        xos_stl::auto_lock<thread_lock> lock( &m_file_lock );
        for( file::T * pFile : m_file_list )
        {
            module::T * pM = (module::T *)pFile->get_module();
            m_list.push_back( pM );
        }
        return ret;
    }

    // !!!只允许在启动载入时使用，因为没有锁保护!!!
    xos_box::i_str_property * path::get_dir_prop()
    {
        return m_pDirProp;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int path::init_data()
    {
        int ret = 0;
        m_full_path = "";
        m_full_uri = "";
        m_path = "";
        m_pFileProp = 0;
        m_pDirProp = 0;
        m_pFatherPath = 0;
        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    int path::init()
    {
        int ret = 0;
        m_pFileProp = mgr::container()->box()->get_str_prop();
        m_pDirProp = mgr::container()->box()->get_str_prop();
        return ret;
    }

    int path::term()
    {
        int ret = 0;
        xos_stl::release_interface( m_pFileProp );
        xos_stl::release_interface( m_pDirProp );
        m_file_list.clear();
        init_data();
        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

} // xos_http
